﻿https://www.nowcoder.com/practice/16f59b169d904f8898d70d81d4a140a0?tpId=94&tqId=31064&rp=1&ru=%2Factivity%2Foj&qru=%2Fta%2Fbit-kaoyan%2Fquestion-ranking&tPage=2
//描述
//输入一个英文句子，把句子中的单词(不区分大小写)按出现次数按从多到少把单词和次数在屏幕上输出来，
//次数一样的按照单词小写的字典序排序输出，要求能识别英文单词和句号。
#include <iostream>
#include <map>
#include <string.h>
#include <string>
using namespace std;

int main()
{
    char str[1000];
    fgets(str, 1000, stdin);
    str[0] += 32;
    str[strlen(str) - 1] = '\0';
    string _str(str);
    map<string, int> m;
    for (int begin = 0, end = 0; end < _str.size(); end++)
    {
        if (_str[end] == ' ' || _str[end] == '.')
        {
            m[_str.substr(begin, end - begin)]++;
            begin = end + 1;
        }
    }

    auto it = m.begin();
    while (it != m.end())
    {


        cout << it->first << ":" << it->second << endl;
        ++it;
    }


}
/*﻿692.前K个高频单词
已解答
中等
相关标签
相关企业
给定一个单词列表 words 和一个整数 k ，返回前 k 个出现次数最多的单词。

返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率， 按字典顺序 排序。*/

https ://leetcode.cn/problems/top-k-frequent-words/description/

class Solution
{
public:

    struct compare
    {
        bool operator() (const pair<string, int>& p1, const pair<string, int>& p2)
        {
            return(p1.second > p2.second);
        }
    };

    vector<string> topKFrequent(vector<string>& words, int k)
    {

        map<string, int> mp;
        for (auto e : words)
        {
            mp[e]++;
        }

        vector<pair<string, int>> v(mp.begin(), mp.end());
        stable_sort(v.begin(), v.end(), compare());
        vector<string> vv;

        vector<pair<string, int>> ::iterator it = v.begin();
        while (k--)
        {
            vv.push_back(it->first);
            ++it;
        }
        return vv;
    }
};